package com.xyrl.starter.lock.redis.lock;

/**
 * @author zhongp
 * @title: DistributedLock
 * @projectName xyrl
 * @description: TODO
 * @date 2019/12/09 15:57
 */
public interface DistributedLock {
    /**
     * 超时时间
     */
    static final long TIMEOUT_MILLIS = 30000;
    /**
     * 默认执行次数
     */
    static final int RETRY_TIMES = Integer.MAX_VALUE;
    /**
     * 休眠时间
     */
    static final long SLEEP_MILLIS = 500;

    /**
     * 添加同步锁
     *
     * @param key 锁key
     * @return
     */
    boolean lock(String key);

    /**
     * 添加同步锁
     *
     * @param key        锁key
     * @param retryTimes 执行次数
     * @return
     */
    boolean lock(String key, int retryTimes);

    /**
     * 添加同步锁
     *
     * @param key         锁key
     * @param retryTimes  执行次数
     * @param sleepMillis 休眠时间
     * @return
     */
    boolean lock(String key, int retryTimes, long sleepMillis);

    /**
     * 添加同步锁
     *
     * @param key    锁key
     * @param expire 超时时间
     * @return
     */
    boolean lock(String key, long expire);

    /**
     * 添加同步锁
     *
     * @param key        锁key
     * @param expire     超时时间
     * @param retryTimes 执行次数
     * @return
     */
    boolean lock(String key, long expire, int retryTimes);

    /**
     * 添加同步锁
     *
     * @param key         锁key
     * @param expire      超时时间
     * @param retryTimes  执行次数
     * @param sleepMillis 休眠时间
     * @return
     */
    boolean lock(String key, long expire, int retryTimes, long sleepMillis);

    /**
     * 解除锁
     *
     * @param key 锁key
     * @return
     */
    boolean releaseLock(String key);

    /**
     * 锁定而不等待
     * @author zhongp
     * @date 2019-12-27 10:05:07
     * @param key 锁key
     * @description 锁定而不等待 加锁的值 为随机生成的uuid 加锁时间默认为30钞(30钞后自动删除值）
    */
    boolean lockWithoutWaiting(String key);

    /**
     * 锁定而不等待
     *
     * @param key   锁key
     * @param value 值
     * @return
     */
    boolean lockWithoutWaiting(String key, String value);

    /**
     * 同步锁（未拿到锁直接返回失败，不用等待再次拿锁）
     *
     * @param key    同步锁
     * @param value  值
     * @param expire 超时间
     * @return
     */
    boolean lockWithoutWaiting(String key, String value, long expire);

    /**
     * 解锁（只能解除与值相同的锁）
     *
     * @param key   锁key
     * @param value 锁对应的值
     * @return
     */
    boolean releaseLock(String key, String value);
}
